package br.com.it4.zmed.service;

import java.util.List;

import br.com.it4.framework.util.exception.BusinessException;
import br.com.it4.framework.util.exception.SystemException;
import br.com.it4.zmed.entity.Paciente;
import br.com.it4.zmed.filter.PacienteFilter;

/**
 * Interface de acesso as funcionalidades de paciente.
 * 
 * @author Mozart Silva (mozart.vsilva@gmail.com)
 * 
 */
public interface PacienteService {

    /**
     * Adiciona um determinado paciente.
     * 
     * @param paciente
     *            O paciente a ser adicionado.
     * @return O paciente adicionado.
     * @throws SystemException
     *             Caso ocorra algum erro na execução.
     * @throws BusinessException
     *             Exceção caso ocorra erro na validação.
     */
    public Paciente addPaciente(Paciente paciente) throws SystemException, BusinessException;

    /**
     * Atualiza um determinado paciente.
     * 
     * @param paciente
     *            O paciente a ser atualizado.
     * @return O paciente atualizado.
     * @throws SystemException
     *             Caso ocorra algum erro na execução.
     * @throws BusinessException
     *             Exceção caso ocorra erro na validação.
     */
    public Paciente updatePaciente(Paciente paciente) throws SystemException, BusinessException;

    /**
     * Remove um determinado paciente.
     * 
     * @param paciente
     *            O perfil a ser removido.
     * @throws SystemException
     *             Caso ocorra algum erro na execução.
     */
    public void removePaciente(Paciente paciente) throws SystemException;

    /**
     * Consulta um determinado paciente a partir da entidade.
     * 
     * @param codigo
     *            O codigo do paciente a ser consultado.
     * @return A lista de pacientes.
     * @throws SystemException
     *             Caso ocorra algum erro na execução.
     */
    public Paciente getPaciente(Long codigo) throws SystemException;

    /**
     * Consulta a lista de pacientes.
     * 
     * @param filtro
     *            Filtro para o paciente.
     * @return A lista de pacientes.
     * @throws SystemException
     *             Caso ocorra algum erro na execução.
     */
    public List<Paciente> getPacientes(PacienteFilter filtro) throws SystemException;

    /**
     * Consulta um determinado número de pacientes a partir do filtro.
     * 
     * @param filtro
     *            Filtro para o paciente.
     * @param registroInicio
     *            O registro de inicio retornado.
     * @param registroFim
     *            O registro final retornado.
     * @return A lista de pacientes.
     * @throws SystemException
     *             Caso ocorra algum erro na execução.
     */
    public List<Paciente> getPacientes(PacienteFilter filtro, int registroInicio, int registroFim) throws SystemException;

    /**
     * Calcula o número de registros de pacientes a partir pelo filtro.
     * 
     * @param filtro
     *            Filtro para o paciente.
     * @return O número de registros encontrados.
     * @throws SystemException
     *             Caso ocorra algum erro na execução.
     */
    public Long getPacientesCount(PacienteFilter filtro) throws SystemException;

}